Quy định chung

Tổ chức cây thư mục như sau:

Pasted image 20250326152040.png

master

master
	Dockerfile
	config
		ssh
			authorized_keys
			id_rsa
			id_rsa.pub
		.bashrc
		core-site.xml
		hdfs-site.xml
		mapred-site.xml
		yarn-site.xml
		workers

Pasted image 20250326151404.png
Pasted image 20250326151422.png
Pasted image 20250326151432.png

slave

slave
	Dockerfile
	config
		ssh
			authorized_keys
		.bashrc
		core-site.xml
		hdfs-site.xml
		yarn-site.xml

Pasted image 20250326151513.png
Pasted image 20250326151522.png
Pasted image 20250326151529.png

I. Máy master

1. Cài đặt hệ điều hành và môi trường

# Chọn hệ điều hành
FROM ubuntu:22.04

# tạo user/ pass cho user root
RUN echo "root:root" | chpasswd

# Cài đặt java, ssh, vim
RUN apt-get update && apt-get upgrade -y && \
    apt-get install -y openjdk-8-jdk wget ssh openssh-server vim sudo iputils-ping && \
    apt-get clean

2. Cài đặt Hadoop với user hadoopvinhtuong

# Tạo user hadoopvinhtuong
RUN adduser --disabled-password --gecos "" hadoopvinhtuong && \
    echo "hadoopvinhtuong:hadoopvinhtuong" | chpasswd && \
    usermod -aG sudo hadoopvinhtuong && \
    echo "hadoopvinhtuong ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers

# Cài đặt Hadoop
USER hadoopvinhtuong
WORKDIR /home/hadoopvinhtuong
RUN wget https://dlcdn.apache.org/hadoop/common/hadoop-3.4.1/hadoop-3.4.1.tar.gz && \
    tar -xzf hadoop-3.4.1.tar.gz && \
    mv hadoop-3.4.1 hadoop && \
    rm hadoop-3.4.1.tar.gz

3. Setup SSH

Thiết lập các thuộc tính cho SSH để đăng nhập vào máy với vai trò root

# Configure SSH
RUN ssh-keygen -A && \
    sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config && \
    sed -i 's/#PasswordAuthentication yes/PasswordAuthentication yes/' /etc/ssh/sshd_config && \
    sed -i 's/#PubkeyAuthentication yes/PubkeyAuthentication yes/' /etc/ssh/sshd_config && \

    mkdir -p /var/run/sshd

4. Setup Hadoop

Trước bước setup hadoop, phải chuẩn bị các file config từ đầu

  • bashrc (môi trường)
  • core-site.xml
  • hdfs-site.xml
  • yarn-site.xml
  • mapred-site.xml
  • worker (khai báo các worker trong cụm cluster)
  • file SSH (trong đó có Key, id_rsa, id_rsa.pub) (lấy từ máy VMware)Pasted image 20250326134518.png
    Các file này lấy từ file cô châu

Bashrc

# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

  
# don't put duplicate lines or lines starting with space in the history.
# See bash(1) for more options
HISTCONTROL=ignoreboth


# append to the history file, don't overwrite it
shopt -s histappend


# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
HISTSIZE=1000
HISTFILESIZE=2000

# check the window size after each command and, if necessary,
# update the values of LINES and COLUMNS.
shopt -s checkwinsize


# If set, the pattern "**" used in a pathname expansion context will
# match all files and zero or more directories and subdirectories.
#shopt -s globstar

  
# make less more friendly for non-text input files, see lesspipe(1)
[ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)"


# set variable identifying the chroot you work in (used in the prompt below)
if [ -z "${debian_chroot:-}" ] && [ -r /etc/debian_chroot ]; then
    debian_chroot=$(cat /etc/debian_chroot)
fi


# set a fancy prompt (non-color, unless we know we "want" color)
case "$TERM" in
    xterm-color|*-256color) color_prompt=yes;;
esac

  
# uncomment for a colored prompt, if the terminal has the capability; turned
# off by default to not distract the user: the focus in a terminal window
# should be on the output of commands, not on the prompt
#force_color_prompt=yes

if [ -n "$force_color_prompt" ]; then
    if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
    # We have color support; assume it's compliant with Ecma-48
    # (ISO/IEC-6429). (Lack of such support is extremely rare, and such
    # a case would tend to support setf rather than setaf.)
    color_prompt=yes
    else
    color_prompt=
    fi
fi


if [ "$color_prompt" = yes ]; then
    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
else
    PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi
unset color_prompt force_color_prompt
  

# If this is an xterm set the title to user@host:dir
case "$TERM" in
xterm*|rxvt*)
    PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"
    ;;
*)
    ;;
esac

  
# enable color support of ls and also add handy aliases
if [ -x /usr/bin/dircolors ]; then
    test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
    alias ls='ls --color=auto'
    #alias dir='dir --color=auto'
    #alias vdir='vdir --color=auto'

    alias grep='grep --color=auto'
    alias fgrep='fgrep --color=auto'
    alias egrep='egrep --color=auto'
fi


# colored GCC warnings and errors
#export GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01'


# some more ls aliases
alias ll='ls -alF'
alias la='ls -A'
alias l='ls -CF'
  
# Add an "alert" alias for long running commands.  Use like so:
#   sleep 10; alert
alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'

# Alias definitions.
# You may want to put all your additions into a separate file like
# ~/.bash_aliases, instead of adding them here directly.
# See /usr/share/doc/bash-doc/examples in the bash-doc package.

if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
fi


# enable programmable completion features (you don't need to enable
# this, if it's already enabled in /etc/bash.bashrc and /etc/profile
# sources /etc/bash.bashrc).
if ! shopt -oq posix; then
  if [ -f /usr/share/bash-completion/bash_completion ]; then
    . /usr/share/bash-completion/bash_completion
  elif [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
  fi
fi

export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-amd64

export HADOOP_HOME=/home/hadoopvinhtuong/hadoop

export PATH=$PATH:$HADOOP_HOME/bin

export PATH=$PATH:$HADOOP_HOME/sbin

export HADOOP_MAPRED_HOME=$HADOOP_HOME

export HADOOP_COMMON_HOME=$HADOOP_HOME

export HADOOP_HDFS_HOME=$HADOOP_HOME

export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop

export HADOOP_YARN_HOME=$HADOOP_HOME

export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native

export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib/native"

core-site.xml

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
  
http://www.apache.org/licenses/LICENSE-2.0
  
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. See accompanying LICENSE file.
-->

<!-- Put site-specific property overrides in this file. -->
<configuration>
      <property>
            <name>hadoop.tmp.dir</name>
            <value>/home/hadoopvinhtuong/tmp</value>
            <description>Temporary Directory.</description>
      </property>

      <property>
            <name>fs.defaultFS</name>
            <value>hdfs://vinhtuong-master:9000</value>
            <description>Use HDFS as file storage engine</description>
      </property>
</configuration>

hdfs-site.xml

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. See accompanying LICENSE file.
-->
<!-- Put site-specific property overrides in this file. -->

<configuration>
      <property>
            <name>dfs.replication</name>
            <value>2</value>
      </property>

      <property>
            <name>dfs.namenode.name.dir</name>
            <value>/home/hadoopvinhtuong/hadoop/hadoop_data/hdfs/namenode</value>
      </property>

      <property>
            <name>dfs.datanode.data.dir</name>
            <value>/home/hadoopvinhtuong/hadoop/hadoop_data/hdfs/datanode</value>
      </property>
      
</configuration>

yarn-site.xml

<?xml version="1.0"?>
<!--
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at 

http://www.apache.org/licenses/LICENSE-2.0  

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. See accompanying LICENSE file.
-->

<configuration>
      <property>
            <name>yarn.nodemanager.aux-services</name>
            <value>mapreduce_shuffle</value>
      </property>
      
      <property>
            <name>yarn.nodemanager.env-whitelist</name>
<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
      </property>

      <property>
            <name>yarn.resourcemanager.scheduler.address</name>
            <value>vinhtuong-master:9002</value>
      </property>

      <property>
            <name>yarn.resourcemanager.address</name>
            <value>vinhtuong-master:9003</value>
      </property>
      
      <property>
            <name>yarn.resourcemanager.webapp.address</name>
            <value>vinhtuong-master:9004</value>
      </property>

      <property>
            <name>yarn.resourcemanager.resource-tracker.address</name>
            <value>vinhtuong-master:9005</value>
      </property>

      <property>
            <name>yarn.resourcemanager.admin.address</name>
            <value>vinhtuong-master:9006</value>
      </property>

</configuration>

mapred-site.xml

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. See accompanying LICENSE file.
-->

<!-- Put site-specific property overrides in this file. -->
<configuration>
      <property>
            <name>mapreduce.application.classpath</name> <value>$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/*:$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/lib/*</value>
      </property>

      <property>
            <name>mapreduce.jobtracker.address</name>
            <value>vinhtuong-master:9001</value>
      </property>

      <property>
            <name>mapreduce.framework.name</name>
            <value>yarn</value>
      </property>

      <property>
            <name>yarn.app.mapreduce.am.env</name>
            <value>HADOOP_MAPRED_HOME=/home/hadoopvinhtuong/hadoop</value>
      </property>

      <property>
            <name>mapreduce.map.env</name>      
            <value>HADOOP_MAPRED_HOME=/home/hadoopvinhtuong/hadoop</value>
      </property>

      <property>
            <name>mapreduce.reduce.env</name>
            <value>HADOOP_MAPRED_HOME=/home/hadoopvinhtuong/hadoop</value>
      </property>

</configuration>

worker

vinhtuong-slave1 

Docker file

  • Cần cài thêm 1 công cụ dos2unix:
    Nguyên nhân:
  • Mình cần copy file từ win qua linux
  • file từ win có định dạng dos
  • file từ linux là unix
  • nên cần công cụ để chuyển tất cả các file thành định dạng unix
# Khai báo JAVA_HOME trong hadoop
RUN echo "export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-amd64" >> /home/hadoopvinhtuong/hadoop/etc/hadoop/hadoop-env.sh

# Copy những file đã chuẩn bị ở trên vào máy
COPY config/.bashrc /home/hadoopvinhtuong/.bashrc
COPY config/core-site.xml /home/hadoopvinhtuong/hadoop/etc/hadoop/core-site.xml
COPY config/hdfs-site.xml /home/hadoopvinhtuong/hadoop/etc/hadoop/hdfs-site.xml
COPY config/mapred-site.xml /home/hadoopvinhtuong/hadoop/etc/hadoop/mapred-site.xml
COPY config/yarn-site.xml /home/hadoopvinhtuong/hadoop/etc/hadoop/yarn-site.xml
COPY config/workers /home/hadoopvinhtuong/hadoop/etc/hadoop/workers

# COPY files ssh vào /home/hadoopvinhtuong/.ssh
COPY config/ssh/* /home/hadoopvinhtuong/.ssh/

# Cấp quyền
USER root
RUN chmod 700 /home/hadoopvinhtuong/.ssh && \
    chmod 600 /home/hadoopvinhtuong/.ssh/id_rsa && \
    chmod 644 /home/hadoopvinhtuong/.ssh/id_rsa.pub && \
    chmod 600 /home/hadoopvinhtuong/.ssh/authorized_keys && \
    chown -R hadoopvinhtuong:hadoopvinhtuong /home/hadoopvinhtuong/.ssh
  
# dos2unix
RUN apt-get update && apt-get install -y dos2unix && apt-get clean

# Chuyển sang Unix
RUN dos2unix /home/hadoopvinhtuong/.bashrc && \
    dos2unix /home/hadoopvinhtuong/hadoop/etc/hadoop/core-site.xml && \
    dos2unix /home/hadoopvinhtuong/hadoop/etc/hadoop/hdfs-site.xml && \
    dos2unix /home/hadoopvinhtuong/hadoop/etc/hadoop/yarn-site.xml && \
    dos2unix /home/hadoopvinhtuong/.ssh/* && \
    dos2unix /home/hadoopvinhtuong/hadoop/etc/hadoop/mapred-site.xml && \
    dos2unix /home/hadoopvinhtuong/hadoop/etc/hadoop/workers
    
# Format HDFS
USER hadoopvinhtuong
RUN hdfs namenode -format


# Mở các ports
USER root
EXPOSE 9000 9001 9002 9003 9004 9005 9006 9870 9864 8088 8042

# Start SSH and Hadoop services
CMD ["/bin/bash", "-c", "service ssh start && su - hadoopvinhtuong && bash"]

II. Máy slave

Các bước cài đặt tương tự với máy master, có chỉ khác 1 vài chỗ

  • không có mapred-site.xml
  • không format
  • mở port ít hơn
  • SSH file chỉ có key

1. Cài đặt hệ điều hành và môi trường

# Chọn hệ điều hành
FROM ubuntu:22.04

# tạo user/ pass cho user root
RUN echo "root:root" | chpasswd

# Cài đặt java, ssh, vim
RUN apt-get update && apt-get upgrade -y && \
    apt-get install -y openjdk-8-jdk wget ssh openssh-server vim sudo iputils-ping && \
    apt-get clean

2. Cài đặt Hadoop với user hadoopvinhtuong

# Tạo user hadoopvinhtuong
RUN adduser --disabled-password --gecos "" hadoopvinhtuong && \
    echo "hadoopvinhtuong:hadoopvinhtuong" | chpasswd && \
    usermod -aG sudo hadoopvinhtuong && \
    echo "hadoopvinhtuong ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers

# Cài đặt Hadoop
USER hadoopvinhtuong
WORKDIR /home/hadoopvinhtuong
RUN wget https://dlcdn.apache.org/hadoop/common/hadoop-3.4.1/hadoop-3.4.1.tar.gz && \
    tar -xzf hadoop-3.4.1.tar.gz && \
    mv hadoop-3.4.1 hadoop && \
    rm hadoop-3.4.1.tar.gz

3. Setup SSH

Thiết lập các thuộc tính cho SSH để đăng nhập vào máy với vai trò root

# Configure SSH
RUN ssh-keygen -A && \
    sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config && \
    sed -i 's/#PasswordAuthentication yes/PasswordAuthentication yes/' /etc/ssh/sshd_config && \
    sed -i 's/#PubkeyAuthentication yes/PubkeyAuthentication yes/' /etc/ssh/sshd_config && \

    mkdir -p /var/run/sshd

4. Setup Hadoop

Trước bước setup hadoop, phải chuẩn bị các file config từ đầu

  • bashrc (môi trường)
  • core-site.xml
  • hdfs-site.xml
  • yarn-site.xml
  • file SSH (trong đó có Key) (lấy từ máy VMware)Pasted image 20250326134518.png
# Khai báo JAVA_HOME trong hadoop
RUN echo "export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-amd64" >> /home/hadoopvinhtuong/hadoop/etc/hadoop/hadoop-env.sh

# Copy những file đã chuẩn bị ở trên vào máy
COPY config/.bashrc /home/hadoopvinhtuong/.bashrc
COPY config/core-site.xml /home/hadoopvinhtuong/hadoop/etc/hadoop/core-site.xml
COPY config/hdfs-site.xml /home/hadoopvinhtuong/hadoop/etc/hadoop/hdfs-site.xml
COPY config/yarn-site.xml /home/hadoopvinhtuong/hadoop/etc/hadoop/yarn-site.xml

# COPY files ssh vào /home/hadoopvinhtuong/.ssh
COPY config/ssh/* /home/hadoopvinhtuong/.ssh/

# Cấp quyền
USER root
RUN chmod 700 /home/hadoopvinhtuong/.ssh/ && \
    chmod 600 /home/hadoopvinhtuong/.ssh/authorized_keys && \
    chown -R hadoopvinhtuong:hadoopvinhtuong /home/hadoopvinhtuong/.ssh

# dos2unix
RUN apt-get update && apt-get install -y dos2unix && apt-get clean

# chuyển sang Unix format
RUN dos2unix /home/hadoopvinhtuong/.bashrc && \
    dos2unix /home/hadoopvinhtuong/hadoop/etc/hadoop/core-site.xml && \
    dos2unix /home/hadoopvinhtuong/hadoop/etc/hadoop/hdfs-site.xml && \
    dos2unix /home/hadoopvinhtuong/hadoop/etc/hadoop/yarn-site.xml && \
    dos2unix /home/hadoopvinhtuong/.ssh/*

# Mở ports
EXPOSE 9864

# Start SSH and Hadoop services at runtime
CMD ["bash", "-c", "service ssh start && bash"]

Build image

docker build -t hadoop-master ./master
docker build -t hadoop-slave ./slave
  • Từ 2 cái image này sẽ buid ra máy

Build máy

1. Giản lược các lệnh hiển thị

@echo off

2. Đặt số lượng node trong cluster

REM The default node number is 3
set N=%1
if "%N%"=="" set N=3
  • set N=%1: Gán biến N với tham số đầu tiên truyền vào script. ví dụ nếu chạy start-cluster.bat 5 thì N=5.
  • if "%N%"=="" set N=3: Nếu không truyền tham số, mặc định số node là 3.

3. Tính số lượng slave node (N-1)

REM Tính giá trị N-1 và lưu vào biến Nminus1
set /a Nminus1=%N%-1
  • set /a dùng để thực hiện phép toán số học.
  • Nminus1 = N - 1, nghĩa là nếu có 3 node (N=3), thì sẽ có Nminus1=2 slave node.

4. Tạo mạng Docker cho Hadoop

REM Create hadoop network
docker network create --driver=bridge hadoop-network >nul 2>&1
  • Tạo một mạng Docker kiểu bridge có tên hadoop-network.
  • >nul 2>&1: Ẩn thông tin đầu ra và lỗi để tránh hiển thị không cần thiết.

5. Khởi động container của Hadoop Master

Xoá cái cũ

REM Start Hadoop master container
echo start vinhtuong-master container...
docker rm -f vinhtuong-master >nul 2>&1
  • Xóa container vinhtuong-master nếu nó đã tồn tại (rm -f dùng để xóa mà không cần hỏi).
  • >nul 2>&1 để ẩn thông tin đầu ra.

Bắt đầu chạy cái mới

docker run ^
    -p 9870:9870 ^
    -p 9864:9864 ^
    -p 8088:8088 ^
    -p 8042:8042 ^
    -p 9000-9006:9000-9006 ^
    -itd ^
    --net=hadoop-network ^
    --name vinhtuong-master ^
    --hostname vinhtuong-master ^
    hadoop-master >nul 2>&1
  • docker run: Chạy một container mới.
  • -p 9870:9870: Mở cổng 9870 (giao diện Web của HDFS).
  • -p 9864:9864: Cổng DataNode Web UI.
  • -p 8088:8088: Cổng Resource Manager Web UI.
  • -p 8042:8042: Cổng NodeManager Web UI.
  • -p 9000-9006:9000-9006: Mở các cổng Hadoop HDFS (9000 là NameNode, các cổng còn lại có thể dùng cho DataNodes).
  • -itd: Chạy container ở chế độ nền (-d) và cho phép tương tác (-it).
  • --net=hadoop-network: Gắn container vào mạng hadoop-network.
  • --name vinhtuong-master: Đặt tên container là vinhtuong-master.
  • --hostname vinhtuong-master: Đặt hostname trong container là vinhtuong-master.
  • hadoop-master: Tên image Docker của Hadoop master.

6. Sao chép danh sách các worker vào Master

REM copy workers file to master container
docker cp master\config\workers vinhtuong-master:/home/hadoopvinhtuong/hadoop/etc/hadoop/workers
  • docker cp: Sao chép tệp workers từ thư mục master/config trên máy host vào container vinhtuong-master trong thư mục cấu hình Hadoop.
REM convert workers from dos to unix
docker exec vinhtuong-master dos2unix /home/hadoopvinhtuong/hadoop/etc/hadoop/workers
  • Chuyển định dạng

7. Khởi động các container Slave

REM Start Hadoop slave containers
set /a i=1
:loop
if %i% leq %N% (
    echo start vinhtuong-slave%i% container...
    docker rm -f vinhtuong-slave%i% >nul 2>&1
  • set /a i=1: Khởi tạo biến đếm i = 1.
  • :loop: Nhãn để bắt đầu vòng lặp.
  • if %i% leq %N%: Nếu i ≤ N thì tiếp tục vòng lặp.
  • docker rm -f vinhtuong-slave%i%: Xóa container slave nếu tồn tại.
docker run -itd ^
    --net=hadoop-network ^
    --name vinhtuong-slave%i% ^
    --hostname vinhtuong-slave%i% ^
    hadoop-slave >nul 2>&1
  • docker run: Chạy container mới cho slave.
  • --net=hadoop-network: Gắn vào mạng Hadoop.
  • --name vinhtuong-slave%i%: Tên container là vinhtuong-slave1, vinhtuong-slave2,...
  • --hostname vinhtuong-slave%i%: Đặt hostname tương ứng.
  • hadoop-slave: Image Docker của Hadoop slave.
set /a i=%i% + 1
goto loop
  • set /a i=%i% + 1: Tăng i lên 1.
  • goto loop: Quay lại nhãn :loop, tiếp tục tạo container mới cho đến khi đủ số lượng node.

8. Tự động truy cập vào Master

REM Get into the Hadoop master container
docker start -i vinhtuong-master

Full code

@echo off

REM The default node number is 3
set N=%1
if "%N%"=="" set N=3

REM Tính giá trị N-1 và lưu vào biến Nminus1
set /a Nminus1=%N%-1

REM Create hadoop network
docker network create --driver=bridge hadoop-network >nul 2>&1

REM Start Hadoop master container
echo start vinhtuong-master container...
docker rm -f vinhtuong-master >nul 2>&1

docker run ^
    -p 9870:9870 ^
    -p 9864:9864 ^
    -p 8088:8088 ^
    -p 8042:8042 ^
    -p 9000-9006:9000-9006 ^
    -itd ^
    --net=hadoop-network ^
    --name vinhtuong-master ^
    --hostname vinhtuong-master ^
    hadoop-master >nul 2>&1

REM copy workers file to master container
docker cp master\config\workers vinhtuong-master:/home/hadoopvinhtuong/hadoop/etc/hadoop/workers

REM convert workers from dos to unix
docker exec vinhtuong-master dos2unix /home/hadoopvinhtuong/hadoop/etc/hadoop/workers


REM Start Hadoop slave containers
set /a i=1
:loop
if %i% leq %N% (
    echo start vinhtuong-slave%i% container...
    docker rm -f vinhtuong-slave%i% >nul 2>&1
    docker run -itd ^
        --net=hadoop-network ^
        --name vinhtuong-slave%i% ^
        --hostname vinhtuong-slave%i% ^
        hadoop-slave >nul 2>&1
    set /a i=%i% + 1
    goto loop
)

REM Get into the Hadoop master container

docker start -i vinhtuong-master

Tool để sử dụng máy tốt hơn

Mình sẽ sử dụng visual studio code (vscode xanh) để thao tác tiện hơn với giao diện đồ hoạ, nhiều terminal cùng 1 lúc, quản lý file qua cây thư mục, chỉnh sửa code trực tiếp. bằng cách sử dụng extension
Pasted image 20250327155940.png
Pasted image 20250327160235.png